注意:所有文章除特别说明外,转载请注明出处.
Java集合框架 - Collection架构与源码分析
Collection是一个接口,它主要的两个分支是List和Set。List和Set都是接口,它们继承与Collection。List是有序的队列,可以用重复的元素;而Set是数学概念中的集合,不能有重复的元素。List和Set都有它们各自的实现类。
我们抽象出AbstractCollection类来让其他类继承,该类实现类Collection中的绝大部分方法。AbstractList和AbstractSet都继承与AbstractCollection,具体的List实现类继承与AbstractList,而Set的实现类则继承与AbstractSet。
Collection中有个iterator()方法,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。
Collection
//Collection定义
public interface Collection<E> extends Iterable<E> {}
从Collection的定义可以看出,Collection是一个接口。是一个高度抽象出来的集合,包含了集合的基本操作:添加|删除|清空|遍历|是否为空|获取大小等。Collection接口的所有子类都必须实现2中构造函数:1.不带参数的构造函数。2.参数为Collection的构造函数。ps:带参数的构造函数可以用来转换Collection类型。
// Collection的API
abstract boolean add(E object)
abstract boolean addAll(Collection<? extends E> collection)
abstract void clear()
abstract boolean contains(Object object)
abstract boolean containsAll(Collection<?> collection)
abstract boolean equals(Object object)
abstract int hashCode()
abstract boolean isEmpty()
abstract Iterator<E> iterator()
abstract boolean remove(Object object)
abstract boolean removeAll(Collection<?> collection)
abstract boolean retainAll(Collection<?> collection)
abstract int size()
abstract <T> T[] toArray(T[] array)
abstract Object[] toArray()
List
//List定义
public interface List<E> extends Collection<E> {}
从List定义可以得到,List接口继承Collection接口即List是集合的一种。List是有序的队列,List中的每一个元素都有一个索引,第一个元素的索引值为0,往后的元素的索引值依次+1.,List中允许有重复的元素。List继承Collection自然包含了Collection的所有接口,由于List是有序队列,所以它也有自己额外的API接口。
// Collection的API
abstract boolean add(E object)
abstract boolean addAll(Collection<? extends E> collection)
abstract void clear()
abstract boolean contains(Object object)
abstract boolean containsAll(Collection<?> collection)
abstract boolean equals(Object object)
abstract int hashCode()
abstract boolean isEmpty()
abstract Iterator<E> iterator()
abstract boolean remove(Object object)
abstract boolean removeAll(Collection<?> collection)
abstract boolean retainAll(Collection<?> collection)
abstract int size()
abstract <T> T[] toArray(T[] array)
abstract Object[] toArray()
// 相比与Collection,List新增的API:
abstract void add(int location, E object) //在指定位置添加元素
abstract boolean addAll(int location, Collection<? extends E> collection) //在指定位置添加其他集合中的元素
abstract E get(int location) //获取指定位置的元素
abstract int indexOf(Object object) //获得指定元素的索引
abstract int lastIndexOf(Object object) //从右边的索引
abstract ListIterator<E> listIterator(int location) //获得iterator
abstract ListIterator<E> listIterator()
abstract E remove(int location) //删除指定位置的元素
abstract E set(int location, E object) //修改指定位置的元素
abstract List<E> subList(int start, int end) //获取子list
Set
//Set的定义
public interface Set<E> extends Collection<E> {}
Set也继承与Collection接口,且里面不能有重复元素。关于API,Set与Collection的API完全一样,不再赘述。
AbstractCollection
//AbstractCollection的定义
public abstract class AbstractCollection<E> implements Collection<E> {}
AbstractCollection是一个抽象类,实现了Collection中除了iterator()和size()之外的所有方法。AbstractCollection的主要作用是方便其它类实现Collection。如:ArrayList | LinkedList等。它们如果想要实现Collection接口,通过继承AbstractCollection就已经实现大部分方法,再实现iterator()和size()方法即可。
//AbtractCollection源码在这里省略是因为是实现上面的所有方法
AbstractList
//定义
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {}
从定义可以看出,AbstractList是一个继承AbstractCollection,并且实现了List接口的抽象类。它实现了List中除了size()、get(int location)之外的方法。
AbstractList的主要作用:它实现了List接口中的大部分函数,从而方便其它类继承List。另外,和AbstractCollection相比,AbstractList抽象类中,实现了iterator()方法。
//这里省略源码复制,后面对比看..
AbstractSet
//定义
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {}
AbstractSet是一个继承与AbstractCollection,并且实现了Set接口的抽象类。由于Set接口和Collection接口中的API完全一样,所以Set也就没有自己单独的API。和AbstractCollection一样,它实现了List中除iterator()和size()外的方法。所以源码和AbstractCollection的一样。
//源码省略...
Iterator
//定义
public interface Iterator<E> {}
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历其中的元素。Iterator提供的API接口包括:是否存在下一个元素,获取下一个元素和删除当前元素。
注意:Iterator遍历Collection时,是fail-fast机制:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了,那么线程A访问集合时,就会抛出CurrentModificationException异常,产生fail-fast事件。
// Iterator的API
abstract boolean hasNext()
abstract E next()
abstract void remove()